home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
pao
/
towns
/
cdplay
/
src
/
cdpn.c
< prev
next >
Wrap
Text File
|
1991-10-18
|
62KB
|
1,897 lines
/* << High C V1.4 >> **********************************************************
**
** CD 演奏ライブラリを使用した CD PLAYER
**
** 1991.03.19 : CREATE
** 1991.03.23 : FINISH
**
** < HISTORY >
** 1991.03.19 : CREATE
** 1991.03.25 : PROGRAM演奏モードのままCDを入れ換えた時に、未選択合計時間
** の値がおかしくなるのを修正. 再表示していなかったのを修正.
** 1991.03.27 : プログラムモード時のダビング支援用テープ選択および曲選択の機能追加.
**
** < note > : TABS = 4
**
** All Rights Reserved, Copyright (C) Y.Hirata 1991.
**
** Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/
/*-----------------------------------------------------------------------------
** CDDA.LIB 使用上の注意事項
**
** 1.
** ヘッダファイル CDDA.H をインクルードして下さい. CDR.H はインクルードする必要ありません.
**
** 2.
** 使用する関数は、CDDA_switch() だけです.
** PAUSE中とかに、別関数を使用して PAUSE/STOP した場合に、続きの処理が保証
** されません.
**
** 3.
** LINK時には、CDDA.LIB の他に CDR.LIB もLINKして下さい.
** また、LINKオプション -CALLBUFS に 2 以上の値を指定して下さい.
** TWOCASE でLINKして下さい.
-----------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include <fmc.h>
#include "grp.h"
#include "mostype.h"
#include "elevol.h"
#include "sndplay.h"
#include "key.h"
#include "tape.h"
#define _CDPN_MAIN
#include "cdpn.h"
/*-----------------------------------------------------------------------------
** いわゆる隠し機能に相当します♪
-----------------------------------------------------------------------------*/
extern char CDDA_FLG_stop ; /* プログラム終了時にSTOPする? */
/*-----------------------------------------------------------------------------
** 時間監視用に タイマ 割り込みを使用します.
-----------------------------------------------------------------------------*/
unsigned Timeno ; /* タイマ管理番号 */
/*-----------------------------------------------------------------------------
** CTRL+C を マスク するのに使用します.
-----------------------------------------------------------------------------*/
extern void int24_mask( void ) ;
/*-----------------------------------------------------------------------------
** プログラム起動時のオプションで使用します.
-----------------------------------------------------------------------------*/
char Startplay = FALSE ; /* プログラム開始時にPLAYする? */
/*-----------------------------------------------------------------------------
** 停止中/NOT READY中の未アクセスチェックに使用します.
-----------------------------------------------------------------------------*/
char Noaflg = FALSE ; /* 停止中にアクセスしたか? */
/****************************** TIMER Handler ******************************/
static int timer_func( void )
/*=============================================================================
** タイマ 割り込み ハンドラ
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : 0
=============================================================================*/
{
Tcount1 ++ ;
Tcount2 ++ ;
Tcount3 ++ ;
return( 0 ) ;
}
/****************************** パレット初期化 ********************************/
void palinit( void )
/*=============================================================================
** 16 色 パレット の初期化を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
char para[132] ;
int c ;
DWORD( para+0 ) = 16 ; /* 登録数 */
for ( c=0; c<16; c++ ) {
DWORD( para+ 4+c*8 ) = c ; /* NUMBER */
BYTE( para+ 8+c*8 ) = Palette[c][0] ; /* BLUE */
BYTE( para+ 9+c*8 ) = Palette[c][1] ; /* RED */
BYTE( para+10+c*8 ) = Palette[c][2] ; /* GREEN */
BYTE( para+11+c*8 ) = 0 ; /* NULL */
}
EGB_palette( Gwork,0,para ) ;
}
/**************************** タイマ割り込み初期化 ****************************/
void timer_init( void )
/*=============================================================================
** タイマ 割り込みの登録を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
TIM_TIME timer ;
Tcount1 = 0 ; /* CDC ウェイト用 */
Tcount2 = 0 ; /* 時間表示制御用 */
Tcount3 = 0 ; /* 未アクセス時間チェック用 */
timer.mode = 0 ; /* インターバルモード */
timer.inf = 0 ; /* 割り込みモード */
BSETCODEADR( (char *)&timer.adr,timer_func ) ;
timer.hcycle = 0x00 ;
timer.lcycle = 2 ; /* 20ms */
TIM_settime( &timer,(int *)&Timeno ) ;
}
/****************************** タイマ割り込み終了 ****************************/
void timer_end( void )
/*=============================================================================
** タイマ 割り込みの解除を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
TIM_clrtime( Timeno ) ;
}
/******************************** 初期化処理 *******************************/
void valinit( void )
/*=============================================================================
** グローバル変数の初期化を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int c ;
Flg.pause = FALSE ;
Flg.repeat = FALSE ;
Flg.shuffle = FALSE ;
Flg.playon = FALSE ;
Flg.program = FALSE ;
Flg.prgchk = FALSE ;
Flg.tape = FALSE ;
for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
Prginf[c] = ZERO ;
Prgcnt[c] = ZERO ;
}
XORno = ZERO ;
Musicno = ZERO ;
Status = CDDA_STAT_NOTREADY ;
Dispno = Dispmin = Dispsec = ZERO ;
}
/***************************** マウスの位置設定 *******************************/
void mossetpos( int evno )
/*=============================================================================
** マウスカーソル を指定された スイッチ の中心に セット する.
**
** < INPUT > : イベント番号(SWVAL+スイッチ番号) or 曲番号
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int x, y ;
int sw ;
/*-----------------------------------------------------------------------------
** evno が SWVALより大きな時には、演奏スイッチの処理である.
-----------------------------------------------------------------------------*/
if ( evno >= SWVAL ) {
sw = evno - SWVAL ;
if ( sw < ZERO || sw >= SWPOINT ) return ;
x = ( Position[sw].e.x - Position[sw].s.x + 1 ) / 2 +
Position[sw].s.x ;
y = ( Position[sw].e.y - Position[sw].s.y + 1 ) / 2 +
Position[sw].s.y ;
MOS_setpos( x,y ) ;
/*-----------------------------------------------------------------------------
** 曲番号指定時の処理
-----------------------------------------------------------------------------*/
} else {
if ( ( CDDA_INFO_buf.start <= evno && evno <= CDDA_INFO_buf.end &&
!CDDA_data_check( evno ) ) || evno == SW_TOTAL ) {
x = PSInf.x + ((evno-1)/20)*121 + 1 + 60 ;
y = (PSInf.y+YCDOT+1) + ((evno-1)%20)*(YCDOT+1) + 1 + 7 ;
MOS_setpos( x,y ) ;
}
}
}
/******************************** 初期化処理 *******************************/
void init( void )
/*=============================================================================
** EGB / SND / MOS / 電子ボリューム 等の初期設定を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int c ;
/* TAPE選択の初期設定 */
TAPE_init() ;
/* EGB 初期設定 */
EGB_init( Gwork,GworkSize ) ; /* EGB初期化 */
EGB_resolution( Gwork,0,3 ) ; /* EGB 16 color */
EGB_resolution( Gwork,1,3 ) ; /* EGB 16 color */
EGB_displayPage( Gwork,1,3 ) ; /* show page 0 & 1 : pr 1 */
EGB_writePage( Gwork,1 ) ;
/* サウンド初期化 */
SND_init( Swork ) ;
/* マウス 初期設定 */
MOS_start( Mwork,MworkSize ) ;
MOS_writePage( 1 ) ;
MOS_color( 0,C_GREENON ) ;
mostype( MOSTYPE_STANDARD ) ;
mossetpos( SW_PLAY+SWVAL ) ;
dispmouse( FALSE ) ;
/*-----------------------------------------------------------------------------
** 電子ボリュームの設定は、あらかじめアプリケーション側で行う必要があります!
-----------------------------------------------------------------------------*/
SND_pcm_mode_set( 8 ) ; /* PCM音声モードチャンネル数設定 */
SND_elevol_init() ; /* 電子ボリューム初期化 */
ELEVOL_set( ELEVOL_MIC,ZERO,ZERO ) ; /* MIC は ミュート */
ELEVOL_set( ELEVOL_CD,ELEVOL_MAX+1,ELEVOL_MAX+1 ) ; /* CD は MAX */
Flg.mute = FALSE ; /* ミュートは解除状態 */
/* パレット 初期化 */
palinit() ;
/* グローバル変数の初期値設定 */
for ( c=0; c<SWPOINT; c++ ) Swstat[c] = TRUE ;
for ( c=0; c<CDDA_MAX_TRACK; c++ ) Infstat[c] = FALSE ;
Timemode = TM_TR_CLOCK ;
Playmode = SW_CONTINUE ;
valinit() ;
Evol = ELEVOL_MAX ;
}
/***************************** マウス制御を待つ *******************************/
void mosloop( int sw,int *mbot,int *mx,int *my )
/*=============================================================================
** マウス の ボタンクリック が指定された状態になるまで待つ.
**
** < INPUT > : sw ボタンクリック状態.
** < OUTPUT > : mbot - ボタンクリック状態
** : mx - マウス水平座標
** : my - マウス垂直座標
** < RETURN > : なし
=============================================================================*/
{
do {
MOS_rdpos( mbot,mx,my ) ;
} while ( *mbot == sw ) ;
}
/************************** TOTAL枠内のマウスクリックチェック *************************/
int tapeselecton( void )
/*=============================================================================
** マウスが合計時間枠内でクリックされた時のチェックを行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : 有効ならば、真値, 無効ならば、偽値.
=============================================================================*/
{
if ( Playmode != SW_PROGRAM )
return( FALSE ) ; /* プログラム演奏モードでない */
if ( Flg.tape )
return( FALSE ) ; /* 既にテープ選択済 */
if ( CDDA_NOW_status != CDDA_STAT_STOP )
return( FALSE ) ; /* 停止中でない */
if ( CDDA_TOTAL_program > ZERO )
return( FALSE ) ; /* 既にプログラム登録曲あり */
dispselectmusicno( SW_TOTAL ) ;
return( TRUE ) ;
}
/***************************** マウスイベントのチェック ******************************/
int mosevent( int *no )
/*=============================================================================
** マウスがクリックされた時に対応するイベントをチェックする.
**
** < INPUT > : なし
** < OUTPUT > : イベント番号(SWVAL+スイッチ番号) or 曲番号
** < RETURN > : イベントありならば 真値, イベントなしならば 偽値.
**
** イベントに対応するスイッチを表示ONにするので、必要に応じて呼び側で表示OFFにする
** 必要があります.
=============================================================================*/
{
int mbot, mx, my ;
int c ;
MOS_rdpos( &mbot,&mx,&my ) ;
Mosbot = mbot ;
Mosx = mx ;
Mosy = my ;
/*-----------------------------------------------------------------------------
** 時間表示クリア( 停止時/NOT READY時 )
**
** プログラム設定曲確認後(一定時間保留後)は表示をクリアする.
** 一定時間経過後の場合には、disptime()にて プログラム確認用ポインタをクリアする.
-----------------------------------------------------------------------------*/
if ( Flg.prgchk || Tcount2 >= PRG_WAIT ) {
if ( CDDA_NOW_status != CDDA_STAT_PLAY &&
CDDA_NOW_status != CDDA_STAT_PAUSE &&
Dispno != -1 ) {
disptime( ZERO,TM_NODISP ) ;
}
}
/*-----------------------------------------------------------------------------
** 曲番号 : 指定された曲番号が有効かどうかチェックし、有効ならば反転表示する.
**
** 無効の場合でも プログラム設定曲確認中(一定時間保留中)には、反転表示の クリア
** をしない.
-----------------------------------------------------------------------------*/
if ( PSInf.x < mx && mx < (PSInf.x+604) &&
(PSInf.y+YCDOT+1) < my && my < (PSInf.y+YCDOT+339) ) {
c = (mx+103) / 121 - 1 ;
*no = (my-PSInf.y) / 17 + 20*c ;
if ( CDDA_INFO_buf.start <= *no && *no <= CDDA_INFO_buf.end &&
!CDDA_data_check( *no ) ) {
dispselectmusicno( *no ) ;
} else if ( *no == SW_TOTAL ) {
tapeselecton() ;
} else {
if ( Flg.prgchk || Tcount2 >= PRG_WAIT || XORno != Dispno )
dispselectmusicno( ZERO ) ;
}
} else {
if ( Flg.prgchk || Tcount2 >= PRG_WAIT || XORno != Dispno )
dispselectmusicno( ZERO ) ;
}
if ( mbot == MOS_LEFT ) {
/*-----------------------------------------------------------------------------
** 曲番号 : 指定された曲番号が有効かどうかもチェックする.
-----------------------------------------------------------------------------*/
if ( PSInf.x < mx && mx < (PSInf.x+604) &&
(PSInf.y+YCDOT+1) < my && my < (PSInf.y+YCDOT+339) ) {
c = (mx+103) / 121 - 1 ;
*no = (my-PSInf.y) / 17 + 20*c ;
if ( ( CDDA_INFO_buf.start > *no || *no > CDDA_INFO_buf.end ) &&
*no != SW_TOTAL ) return( FALSE ) ;
if ( *no == SW_TOTAL ) { /* ● TAPE選択 ● */
dispmouse( FALSE ) ;
if ( tapeselecton() ) { /* 有効 */
mosloop( mbot,&mbot,&mx,&my ) ; /* マウスの開放を待つ */
TAPE_autoselect() ;
}
dispmouse( TRUE ) ;
return( FALSE ) ;
} else { /* ● 曲番号選択 ● */
if ( CDDA_data_check( *no ) ) /* データ */
return( FALSE ) ;
dispmouse( FALSE ) ;
dispevent( *no,TRUE ) ;
mosloop( mbot,&mbot,&mx,&my ) ; /* マウスの開放を待つ */
dispmouse( TRUE ) ;
return( TRUE ) ;
}
}
/*-----------------------------------------------------------------------------
** 各種スイッチ : 選択された時点で、ON 表示して リターン する.
** 呼び側で、OFF 表示等必要な処理をすること.
-----------------------------------------------------------------------------*/
for ( c=0; c<SWPOINT; c++ ) { /* スイッチ */
if ( Position[c].s.x < mx && mx < Position[c].e.x &&
Position[c].s.y < my && my < Position[c].e.y ) {
*no = SWVAL + c ;
dispmouse( FALSE ) ;
dispevent( *no,TRUE ) ;
dispmouse( TRUE ) ;
return( TRUE ) ;
}
}
}
return( FALSE ) ;
}
/**************************** 演奏曲の表示チェック *****************************/
void checkmusic( int no )
/*=============================================================================
** 演奏曲が指定された時に表示のチェックを行う.
**
** < INPUT > : 演奏曲
** < OUTPUT > : なし
** < RETURN > : なし
**
** マウスは呼び側でOFFにしておいて下さい.
=============================================================================*/
{
int c ;
if ( no < 1 || no > CDDA_MAX_TRACK ) return ;
switch ( Playmode ) {
case SW_PROGRAM :
/*-----------------------------------------------------------------------------
** プログラムモードで一曲も指定されていない時には、一旦全部の曲を消して(演奏終了
** 状態)指定された曲を未演奏表示にする.
-----------------------------------------------------------------------------*/
if ( !CDDA_TOTAL_program ) {
/* プログラムモード時に一曲も指定されていない時 */
disptocmode( SW_PROGRAM,DUMMY ) ;
}
Prginf[no-1] ++ ;
Prgcnt[no-1] ++ ;
dispmusicno( no,TRUE ) ;
break ;
case SW_SINGLE :
/*-----------------------------------------------------------------------------
** シングルモードでは、指定された曲番号以外は、OFF表示とする.
-----------------------------------------------------------------------------*/
for ( c=1; c<no; c++ ) dispmusicno( c,FALSE ) ;
dispmusicno( no,TRUE ) ;
for ( c=no+1; c<=CDDA_INFO_buf.end; c++ ) dispmusicno( c,FALSE ) ;
break ;
case SW_CONTINUE :
/*-----------------------------------------------------------------------------
** CONTINUEモードでは、シャッフル演奏ならば全て ON表示 とし、そうでなければ、
** 指定された曲番号よりも前の曲を OFF表示, 以降を ON表示とする.
-----------------------------------------------------------------------------*/
if ( Flg.shuffle ) {
disptoc( FALSE ) ;
} else {
for ( c=1; c<no; c++ ) dispmusicno( c,FALSE ) ;
for ( c=no; c<=CDDA_INFO_buf.end; c++ ) dispmusicno( c,TRUE ) ;
}
}
}
/******************************* スイッチ状態チェック ******************************/
void checkswitch( void )
/*=============================================================================
** 演奏状態に合わせた スイッチ の ON/OFF 表示を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
if ( Status == CDDA_NOW_status ) return ;
dispmouse( FALSE ) ;
switch ( CDDA_NOW_status ) {
case CDDA_STAT_PLAY :
if ( Flg.shuffle ) dispshuffle( TRUE ) ;
else dispshuffle( FALSE ) ;
dispplay( TRUE ) ;
disppause( FALSE ) ;
break ;
case CDDA_STAT_PAUSE :
if ( Flg.shuffle ) dispshuffle( TRUE ) ;
else dispshuffle( FALSE ) ;
dispplay( TRUE ) ;
disppause( TRUE ) ;
break ;
case CDDA_STAT_STOP :
dispshuffle( FALSE ) ;
dispplay( FALSE ) ;
disppause( FALSE ) ;
break ;
case CDDA_STAT_NOTREADY :
dispswitch_check( SW_STOP ) ;
dispmsgclear() ;
}
dispmouse( TRUE ) ;
}
/***************************** PLAY/PAUSE状態チェック **************************/
void checkdisp_playmusic( void )
/*=============================================================================
** 演奏中の曲情報および時間表示を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
/*-----------------------------------------------------------------------------
** 演奏曲番号が変わっていなければ、時間表示だけを行う.
-----------------------------------------------------------------------------*/
if ( Musicno == CDDA_NOW_musicno ) {
disptime( CDDA_NOW_musicno,Timemode ) ;
return ;
}
/*-----------------------------------------------------------------------------
** 演奏曲番号が変わった時だけ、表示の チェック を行う.
-----------------------------------------------------------------------------*/
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
printf( "<checkdisp_playmusic> " ) ;
printf( "musicno : %d -> %d",Musicno,CDDA_NOW_musicno ) ;
printf( " , mode : %xh , playon : %d\n",Playmode,Flg.playon ) ;
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
if ( Playmode == SW_PROGRAM ) {
/*-----------------------------------------------------------------------------
** 1曲演奏時に、演奏終了する前に次の曲の頭を少し演奏してしまうことがあるの
** で、表示する際には、チェックをする必要がある.
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_start == CDDA_NOW_end ) { /* 一曲演奏時 */
if ( CDDA_NOW_start != CDDA_NOW_musicno ) return ;
}
/*-----------------------------------------------------------------------------
** 演奏曲が変わったならば、演奏終了した曲のプログラム用演奏カウンタを デクリメント する.
** その結果、演奏カウンタが 0 になったならば、OFF表示する.
** 演奏を開始した時には、Flg.playon が 真値である.
-----------------------------------------------------------------------------*/
if ( Musicno > ZERO && !Flg.playon )
Prginf[Musicno-1] -- ;
if ( Prginf[Musicno-1] <= ZERO ) {
dispmouse( FALSE ) ;
dispmusicno( Musicno,FALSE ) ;
dispmouse( TRUE ) ;
}
} else {
switch ( Playmode ) {
case SW_SINGLE :
/*-----------------------------------------------------------------------------
** 1曲演奏時に、演奏終了する前に次の曲の頭を少し演奏してしまうことがあるの
** で、表示する際には、チェックをする必要がある.
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_start == CDDA_NOW_end ) { /* 一曲演奏時 */
if ( CDDA_NOW_start != CDDA_NOW_musicno ) return ;
}
case SW_CONTINUE :
if ( Flg.shuffle ) break ;
if ( Flg.playon ) break ;
dispmouse( FALSE ) ;
dispmusicno( Musicno,FALSE ) ;
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
dispmouse( TRUE ) ;
break ;
}
/*-----------------------------------------------------------------------------
** 演奏を開始した時には、Flg.playon が 真値である.
-----------------------------------------------------------------------------*/
if ( !Flg.playon && Musicno > ZERO ) {
dispmouse( FALSE ) ;
dispmusicno( Musicno,FALSE ) ;
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
dispmouse( TRUE ) ;
}
}
Flg.playon = FALSE ;
/*-----------------------------------------------------------------------------
** 演奏中の曲番号を保持する.
-----------------------------------------------------------------------------*/
Musicno = CDDA_NOW_musicno ;
/*-----------------------------------------------------------------------------
** 演奏時間の表示を行う.
-----------------------------------------------------------------------------*/
disptime( CDDA_NOW_musicno,Timemode ) ;
}
/******************************** STOP状態チェック *****************************/
void checkdisp_stopmusic( void )
/*=============================================================================
** 停止中の曲情報および時間表示を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int c ;
/*-----------------------------------------------------------------------------
** 演奏状態が変化した時だけ時間の表示の チェック を行う.
-----------------------------------------------------------------------------*/
if ( Status == CDDA_NOW_status ) {
if ( !Noaflg && Tcount3 > NOA_WAIT ) {
SNDPLAY_stop( STOP_CH ) ;
SNDPLAY_play( STOP_CH,STOP_SND ) ;
Tcount3 = ZERO ;
}
return ;
}
Noaflg = FALSE ;
Tcount3 = ZERO ;
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
printf( "<checkdisp_stopmusic> " ) ;
printf( "stop - status : %xh -> %xh\n",Status,CDDA_NOW_status ) ;
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
/*-----------------------------------------------------------------------------
** 時間表示を消す.
-----------------------------------------------------------------------------*/
disptime( ZERO,TM_NODISP ) ;
/*-----------------------------------------------------------------------------
** プログラムモードの時は、プログラム曲が表示されている間に演奏したり停止したりと
** いうことがありえる. そのため停止状態になったからといって無条件に表示状態
** を変更できない.
-----------------------------------------------------------------------------*/
if ( Playmode != SW_PROGRAM || Flg.program ) {
/*-----------------------------------------------------------------------------
** プログラムモード以外かプログラム演奏が終了した時には、表示をクリアする.
-----------------------------------------------------------------------------*/
for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
Prginf[c] = ZERO ;
if ( !Flg.repeat ) Prgcnt[c] = ZERO ;
}
if ( !Flg.repeat ) {
if ( Flg.tape ) { /* テープ選択処理時 */
dispmsgclear() ;
}
Flg.tape = FALSE ;
}
dispmouse( FALSE ) ;
if ( Playmode == SW_PROGRAM ) {
disptocmode( SW_PROGRAM,DUMMY ) ;
} else {
disptoc( FALSE ) ;
}
if ( Playmode == SW_PROGRAM ) dispprogramtime() ;
dispmouse( TRUE ) ;
}
Flg.program = FALSE ;
Musicno = ZERO ;
}
/******************************** eject状態チェック ****************************/
void checkdisp_eject( void )
/*=============================================================================
** CD が 抜かれた状態の表示を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
valinit() ;
dispmouse( FALSE ) ;
dispswitch_check( SW_STOP ) ;
disptocclear() ;
disptime( ZERO,TM_NODISP ) ;
dispmsgclear() ;
MOS_horizon( Position[SW_EXIT].s.x,Position[SW_EXIT].e.x ) ;
MOS_vertical( Position[SW_EXIT].s.y,Position[SW_EXIT].e.y ) ;
mossetpos( SW_EXIT+SWVAL ) ;
dispmouse( TRUE ) ;
Noaflg = FALSE ;
Tcount3 = ZERO ;
}
/******************************** reset状態チェック ****************************/
void checkdisp_reset( void )
/*=============================================================================
** CD が セット された状態の表示を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
Noaflg = FALSE ;
Tcount3 = ZERO ;
dispmouse( FALSE ) ;
/* ●● PLAY SWITCH ON ●● */
if ( Startplay ) {
disperrormsg( CDDA_switch( CDDA_SW_PLAY ) ) ;
if ( CDDA_NOW_status == CDDA_STAT_PLAY ) dispplay( TRUE ) ;
} else {
disperrormsg( CDDA_switch( CDDA_SW_TOCREAD ) ) ;
}
disptocmode( Playmode,CDDA_NOW_musicno ) ;
if ( Playmode == SW_PROGRAM ) dispprogramtime() ;
MOS_horizon( 0,639 ) ;
MOS_vertical( 0,479 ) ;
mossetpos( SW_PLAY+SWVAL ) ;
dispmouse( TRUE ) ;
}
/******************************* CD演奏状態チェック ****************************/
void checkstatus( void )
/*=============================================================================
** 演奏状態に応じた画面表示を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
static char ready = FALSE ;
int ret ;
int c ;
/* ●● ステータス取得 ●● */
ret = CDDA_switch( CDDA_SW_STATUS ) ;
checkswitch() ;
if ( ret == CDDA_ERR_REPEAT ) {
/*-----------------------------------------------------------------------------
** リピート演奏に入った時の処理
-----------------------------------------------------------------------------*/
dispmouse( FALSE ) ;
/*-----------------------------------------------------------------------------
** 演奏を開始した時と同じであるので、フラグ を セット する.
-----------------------------------------------------------------------------*/
Flg.playon = TRUE ;
Flg.program = TRUE ;
switch ( Playmode ) {
case SW_SINGLE :
disptocmode( Playmode,CDDA_NOW_musicno ) ;
break ;
case SW_CONTINUE :
disptocmode( Playmode,DUMMY ) ;
break ;
case SW_PROGRAM :
for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
Prginf[c] = Prgcnt[c] ;
}
disptocmode( SW_PROGRAM,DUMMY ) ;
}
dispmouse( TRUE ) ;
} else if ( ret ) {
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
if ( ret == CDDA_ERR_NOTREADY ) {
printf("*") ;
} else {
printf( "<checkstatus> " ) ;
printf( "SW_STATUS error return : %xh",ret ) ;
printf( " , status : %xh -> %xh\n",Status,CDDA_NOW_status ) ;
}
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
/*-----------------------------------------------------------------------------
** NOT READY 状態になった場合の処理
-----------------------------------------------------------------------------*/
if ( ready ) {
ready = FALSE ;
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
printf( "<checkstatus> " ) ;
printf( "now CD eject - return : %xh",ret ) ;
printf( " , status : %xh -> %xh\n",Status,CDDA_NOW_status ) ;
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
SNDPLAY_stop( STOP_CH ) ;
SNDPLAY_stop( RESET_CH ) ;
SNDPLAY_play( EJECT_CH,EJECT_SND ) ;
checkdisp_eject() ;
} else {
if ( !Noaflg && Tcount3 > NOA_WAIT ) {
SNDPLAY_stop( STOP_CH ) ;
SNDPLAY_play( STOP_CH,STOP_SND ) ;
Tcount3 = ZERO ;
}
}
Musicno = ZERO ;
} else {
ready = TRUE ;
if ( CDDA_NOW_status != CDDA_STAT_NOTREADY ) {
if ( Status == CDDA_STAT_NOTREADY ) {
/*-----------------------------------------------------------------------------
** NOT READY 状態から、CD が セット された時の処理
-----------------------------------------------------------------------------*/
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
printf( "<checkdisp_reset> " ) ;
printf( "now CD set - return : %xh",ret ) ;
printf( " , status : %xh -> %xh\n",
Status,CDDA_NOW_status ) ;
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
SNDPLAY_stop( STOP_CH ) ;
SNDPLAY_stop( EJECT_CH ) ;
SNDPLAY_play( RESET_CH,RESET_SND ) ;
checkdisp_reset() ;
} else {
/*-----------------------------------------------------------------------------
** 通常状態の処理
-----------------------------------------------------------------------------*/
if ( Status != CDDA_NOW_status ) {
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
printf( "<checkstatus> " ) ;
printf( "status : %xh -> %xh\n",
Status,CDDA_NOW_status ) ;
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
checkswitch() ;
}
switch ( CDDA_NOW_status ) {
case CDDA_STAT_PLAY :
Flg.pause = FALSE ;
case CDDA_STAT_PAUSE :
SNDPLAY_stop( STOP_CH ) ;
SNDPLAY_stop( EJECT_CH ) ;
SNDPLAY_stop( RESET_CH ) ;
checkdisp_playmusic() ;
break ;
case CDDA_STAT_STOP :
Flg.pause = FALSE ;
checkdisp_stopmusic() ;
}
} /* ステータス取得 CD READY */
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
if ( Status != CDDA_NOW_status ) {
printf( "<checkstatus> " ) ;
printf( "normal - status : %xh -> %xh\n",
Status,CDDA_NOW_status ) ;
}
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
} /* 現在 READY 状態 */
} /* ステータス取得 ERROR or NOERROR */
Status = CDDA_NOW_status ;
}
/******************************* 曲選択処理 ********************************/
void selectmusic( int no )
/*=============================================================================
** 曲が選択された時の処理を行う.
**
** < INPUT > : 曲番号
** < OUTPUT > : なし
** < RETURN > : なし
**
** マウスは呼び側でOFFにしておいて下さい.
=============================================================================*/
{
int ret ;
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
return ;
} else {
if ( Playmode == SW_PROGRAM ) {
/* ●● 曲番号 ON ●● */
ret = CDDA_switch( no ) ;
if ( !ret ) {
/*-----------------------------------------------------------------------------
** プログラム曲の登録時には、時間表示は、TM_TR_CLOCK とする.
** また、CHECK時同様プログラム曲確認中表示である旨を フラグセット する.
** 曲の登録作業は、checkmusic() で行う.
-----------------------------------------------------------------------------*/
Timemode = TM_TR_CLOCK ;
Flg.prgchk = TRUE ;
checkmusic( no ) ;
disptime( no,Timemode ) ;
TAPE_check() ;
dispprogramtime() ;
}
} else {
disptime( ZERO,TM_NODISP ) ;
checkmusic( no ) ;
/* ●● 曲番号 ON ●● */
if ( !CDDA_switch( no ) ) {
dispplay( TRUE ) ;
Flg.playon = TRUE ;
if ( Flg.shuffle ) {
Flg.shuffle = FALSE ;
dispshuffle( FALSE ) ;
disptocmode( SW_CONTINUE,no ) ;
}
} else {
/*-----------------------------------------------------------------------------
** 指定された曲が演奏できなかった時には、PLAYボタンを OFF表示する.
-----------------------------------------------------------------------------*/
switch ( CDDA_NOW_status ) {
case CDDA_STAT_PLAY :
case CDDA_STAT_PAUSE :
break ;
default :
dispplay( FALSE ) ;
dispmusicno( no,FALSE ) ;
}
}
disptime( no,Timemode ) ;
/*-----------------------------------------------------------------------------
** PAUSE中に曲番号が指定された時には、マウス を PLAYボタンに移動しておく.
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) {
mossetpos( SW_PLAY+SWVAL ) ;
}
}
}
}
/****************************** モード選択処理 *******************************/
void selectmode( int mode )
/*=============================================================================
** 演奏モードが選択された時の処理を行う.
**
** < INPUT > : 演奏モード
** < OUTPUT > : なし
** < RETURN > : なし
**
** マウスは呼び側でOFFにしておいて下さい.
=============================================================================*/
{
int c ;
/*-----------------------------------------------------------------------------
** 各演奏モードは、演奏モードが変わった時だけ処理を行う.
-----------------------------------------------------------------------------*/
switch ( mode ) {
case SW_PROGRAM :
Timemode = TM_TR_CLOCK ;
if ( Playmode != SW_PROGRAM &&
CDDA_NOW_status != CDDA_STAT_NOTREADY ) {
MOS_color( 0,C_REDON ) ;
dispmsgclear() ;
/* ● シャッフル演奏中にプログラムモードに移行した時 ● */
Flg.shuffle = FALSE ;
dispshuffle( FALSE ) ;
dispevent( mode+SWVAL,TRUE ) ;
/*-----------------------------------------------------------------------------
** プログラム登録状況をクリアする.
-----------------------------------------------------------------------------*/
for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
Prginf[c] = ZERO ;
Prgcnt[c] = ZERO ;
}
Flg.tape = FALSE ;
if ( ( CDDA_NOW_status == CDDA_STAT_PLAY ||
CDDA_NOW_status == CDDA_STAT_PAUSE ) &&
CDDA_NOW_musicno > ZERO ) {
/*-----------------------------------------------------------------------------
** 演奏中(PAUSE含)ならば、その曲はプログラム登録される.
-----------------------------------------------------------------------------*/
Flg.program = TRUE ;
Flg.prgchk = TRUE ;
Prginf[CDDA_NOW_musicno-1] ++ ;
Prgcnt[CDDA_NOW_musicno-1] ++ ;
}
disptocmode( SW_PROGRAM,DUMMY ) ;
Playmode = SW_PROGRAM ;
disptimeprgsw() ;
}
Playmode = SW_PROGRAM ;
/* ●● PROGRAM MODE SWITCH ON ●● */
CDDA_switch( CDDA_SW_PROGRAM ) ;
/*-----------------------------------------------------------------------------
** ライブラリ CALL 後に、プログラム登録時間が設定される.
-----------------------------------------------------------------------------*/
dispprogramtime() ;
break ;
case SW_SINGLE :
if ( Playmode != SW_SINGLE &&
CDDA_NOW_status != CDDA_STAT_NOTREADY ) {
MOS_color( 0,C_YELLOW ) ;
dispmsgclear() ;
/* ● シャッフル演奏中にプログラムモードに移行した時 ● */
Flg.shuffle = FALSE ;
dispshuffle( FALSE ) ;
dispevent( mode+SWVAL,TRUE ) ;
/*-----------------------------------------------------------------------------
** 演奏中ならば、演奏曲だけがON表示.
** 停止中ならば、すべてON表示.
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_status == CDDA_STAT_STOP ) {
disptoc( FALSE ) ;
} else {
disptocmode( SW_SINGLE,CDDA_NOW_musicno ) ;
}
if ( Playmode == SW_PROGRAM ) {
Playmode = SW_SINGLE ;
disptimeprgsw() ;
}
}
Playmode = SW_SINGLE ;
/* ●● SINGLE MODE SWITCH ON ●● */
CDDA_switch( CDDA_SW_SINGLE ) ;
break ;
case SW_CONTINUE :
if ( Playmode != SW_CONTINUE &&
CDDA_NOW_status != CDDA_STAT_NOTREADY ) {
MOS_color( 0,C_GREENON ) ;
dispmsgclear() ;
/* ● シャッフル演奏中にプログラムモードに移行した時 ● */
Flg.shuffle = FALSE ;
dispshuffle( FALSE ) ;
dispevent( mode+SWVAL,TRUE ) ;
if ( CDDA_NOW_status == CDDA_STAT_PLAY ||
CDDA_NOW_status == CDDA_STAT_PAUSE ) {
disptocmode( SW_CONTINUE,CDDA_NOW_musicno ) ;
} else {
disptoc( FALSE ) ;
}
if ( Playmode == SW_PROGRAM ) {
Playmode = SW_CONTINUE ;
disptimeprgsw() ;
}
Flg.playon = FALSE ;
}
Playmode = SW_CONTINUE ;
/* ●● CONTINUE MODE SWITCH ON ●● */
CDDA_switch( CDDA_SW_CONTINUE ) ;
}
}
/***************************** FF/REW 選択処理 *****************************/
void selectffrew( int mode )
/*=============================================================================
** 先送り/後戻りが選択された時の処理を行う.
**
** < INPUT > : 先送り/後戻りスイッチ
** < OUTPUT > : なし
** < RETURN > : なし
**
** マウスは呼び側でOFFにしておいて下さい.
=============================================================================*/
{
int mbot, mx, my ;
int no, evno ;
/*-----------------------------------------------------------------------------
** Flg.prgchk が真値だと、時間表示されないので、FALSEにし待ち時間をクリアする.
-----------------------------------------------------------------------------*/
Flg.prgchk = FALSE ;
Tcount2 = PRG_WAIT + 1 ;
evno = mode + SWVAL ;
/*-----------------------------------------------------------------------------
** 演奏中かPAUSE中でなければ、スイッチをOFFにして リターン する.
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_status != CDDA_STAT_PLAY &&
CDDA_NOW_status != CDDA_STAT_PAUSE ) {
dispevent( evno,FALSE ) ;
return ;
}
/*-----------------------------------------------------------------------------
** 曲番号が変わった時には、ここで曲表示のON/OFFを行うので、演奏開始した時と
** 同様に、Flg.playon を TRUE にしておく.
**
** スイッチ が押されている間は、ここで繰り返し処理を行う.
** スイッチ が放された時に、リターンする.
**
** 先送り/後戻りのスイッチをONとして、ライブラリ を CALL した後には、スイッチ が放された
** 時点で、そのことを ライブラリ に通知する. (CDDA_SW_BREAKスイッチでCALL)
-----------------------------------------------------------------------------*/
switch ( mode ) {
case SW_REWMUSIC :
no = CDDA_NOW_musicno ;
/* ●● 曲戻し SWITCH ON ●● */
CDDA_switch( CDDA_SW_REWMUSIC ) ;
if ( no != CDDA_NOW_musicno ) {
Flg.playon = TRUE ;
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
if ( Playmode == SW_SINGLE ) {
dispmusicno( no,FALSE ) ;
}
}
disptime( CDDA_NOW_musicno,Timemode ) ;
mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
/* ●● SWITCH 開放 ●● */
CDDA_switch( CDDA_SW_BREAK ) ;
dispevent( evno,FALSE ) ;
break ;
case SW_REWTIME :
no = CDDA_NOW_musicno ;
/* ●● 時間戻し SWITCH ON ●● */
CDDA_switch( CDDA_SW_REWTIME ) ;
if ( no != CDDA_NOW_musicno ) {
Flg.playon = TRUE ;
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
if ( Playmode == SW_SINGLE ) {
dispmusicno( no,FALSE ) ;
}
}
disptime( CDDA_NOW_musicno,Timemode ) ;
while ( TRUE ) {
MOS_rdpos( &mbot,&mx,&my ) ;
if ( mbot != MOS_LEFT ) break ;
no = CDDA_NOW_musicno ;
/* ●● 時間戻し SWITCH ON ●● */
if ( CDDA_switch( CDDA_SW_REWTIME ) ) break ;
if ( no != CDDA_NOW_musicno ) {
Flg.playon = TRUE ;
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
if ( Playmode == SW_SINGLE ) {
dispmusicno( no,FALSE ) ;
}
}
disptime( CDDA_NOW_musicno,Timemode ) ;
} ;
mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
/* ●● SWITCH 開放 ●● */
CDDA_switch( CDDA_SW_BREAK ) ;
dispevent( evno,FALSE ) ;
break ;
case SW_FFTIME :
no = CDDA_NOW_musicno ;
/* ●● 時間送り SWITCH ON ●● */
CDDA_switch( CDDA_SW_FFTIME ) ;
if ( no != CDDA_NOW_musicno ) {
if ( Playmode == SW_PROGRAM ) {
Flg.playon = TRUE ;
if ( no > ZERO ) Prginf[no-1] -- ;
if ( Prginf[no-1] <= ZERO ) dispmusicno( no,FALSE ) ;
} else {
dispmusicno( no,FALSE ) ;
}
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
}
disptime( CDDA_NOW_musicno,Timemode ) ;
while ( TRUE ) {
MOS_rdpos( &mbot,&mx,&my ) ;
if ( mbot != MOS_LEFT ) break ;
no = CDDA_NOW_musicno ;
/* ●● 時間送り SWITCH ON ●● */
if ( CDDA_switch( CDDA_SW_FFTIME ) ) break ;
if ( no != CDDA_NOW_musicno ) {
if ( Playmode == SW_PROGRAM ) {
Flg.playon = TRUE ;
if ( no > ZERO ) Prginf[no-1] -- ;
if ( Prginf[no-1] <= ZERO ) dispmusicno( no,FALSE ) ;
} else {
dispmusicno( no,FALSE ) ;
}
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
}
disptime( CDDA_NOW_musicno,Timemode ) ;
} ;
mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
/* ●● SWITCH 開放 ●● */
CDDA_switch( CDDA_SW_BREAK ) ;
dispevent( evno,FALSE ) ;
break ;
case SW_FFMUSIC :
no = CDDA_NOW_musicno ;
/* ●● 曲送り SWITCH ON ●● */
CDDA_switch( CDDA_SW_FFMUSIC ) ;
if ( no != CDDA_NOW_musicno ) {
if ( Playmode == SW_PROGRAM ) {
Flg.playon = TRUE ;
if ( no > ZERO ) Prginf[no-1] -- ;
if ( Prginf[no-1] <= ZERO ) dispmusicno( no,FALSE ) ;
} else {
dispmusicno( no,FALSE ) ;
}
dispmusicno( CDDA_NOW_musicno,TRUE ) ;
}
disptime( CDDA_NOW_musicno,Timemode ) ;
mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
/* ●● SWITCH 開放 ●● */
CDDA_switch( CDDA_SW_BREAK ) ;
dispevent( evno,FALSE ) ;
}
}
/******************************* 演奏選択処理 ******************************/
void selectplay( int mode )
/*=============================================================================
** 演奏が選択された時の処理を行う.
**
** < INPUT > : 演奏スイッチ
** < OUTPUT > : なし
** < RETURN > : なし
**
** マウスは呼び側でOFFにしておいて下さい.
=============================================================================*/
{
int no, evno ;
evno = mode + SWVAL ;
switch ( mode ) {
case SW_SHUFFLE :
Flg.shuffle = FALSE ;
/*-----------------------------------------------------------------------------
** シャッフル指定時は、CONTINUEモードと同じ表示とする。
-----------------------------------------------------------------------------*/
disptoc( FALSE ) ;
selectmode( SW_CONTINUE ) ;
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
dispevent( evno,FALSE ) ;
break ;
}
/* ●● SHUFFLE SWITCH ON ●● */
no = CDDA_switch( CDDA_SW_SHUFFLE ) ;
if ( !no ) {
/* 演奏 OK! */
Flg.playon = TRUE ;
Flg.shuffle = TRUE ;
dispshuffle( TRUE ) ;
dispplay( TRUE ) ;
checkmusic( CDDA_NOW_start ) ;
disptime( CDDA_NOW_start,Timemode ) ;
} else {
/* 演奏 NG! */
dispshuffle( FALSE ) ;
dispplay( FALSE ) ;
disptoc( FALSE ) ;
disptime( ZERO,TM_NODISP ) ;
}
break ;
case SW_PLAY :
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
dispevent( evno,FALSE ) ;
break ;
}
if ( Playmode == SW_PROGRAM && !CDDA_TOTAL_program ) {
/*-----------------------------------------------------------------------------
** プログラムモードなのに一曲も指定されていない時には、CONTINUEモードに移行して演奏
** する.
-----------------------------------------------------------------------------*/
selectmode( SW_CONTINUE ) ;
/* ●● PLAY SWITCH ON ●● */
no = CDDA_switch( CDDA_SW_PLAY ) ;
if ( no ) dispplay( FALSE ) ;
} else {
/* ●● PLAY SWITCH ON ●● */
no = CDDA_switch( CDDA_SW_PLAY ) ;
disperrormsg( no ) ;
if ( !no ) {
/* 演奏 OK! */
if ( !Flg.pause ) Flg.playon = TRUE ;
switch ( Playmode ) {
case SW_PROGRAM :
Flg.program = TRUE ;
disptocmode( SW_PROGRAM,DUMMY ) ;
break ;
case SW_CONTINUE :
if ( Flg.shuffle && !Flg.pause ) {
Flg.shuffle = FALSE ;
dispshuffle( FALSE ) ;
disptocmode( SW_CONTINUE,CDDA_NOW_musicno ) ;
}
break ;
case SW_SINGLE :
checkmusic( CDDA_NOW_start ) ;
}
} else {
/* 演奏 NG! */
if ( CDDA_NOW_status != CDDA_STAT_PLAY ) {
dispplay( FALSE ) ;
}
}
}
disptime( CDDA_NOW_start,Timemode ) ;
Flg.pause = FALSE ;
}
}
/******************************* 停止選択処理 ******************************/
void selectstop( int mode )
/*=============================================================================
** 停止が選択された時の処理を行う.
**
** < INPUT > : 停止スイッチ
** < OUTPUT > : なし
** < RETURN > : なし
**
** マウスは呼び側でOFFにしておいて下さい.
=============================================================================*/
{
int evno ;
int c ;
evno = mode + SWVAL ;
switch ( mode ) {
case SW_STOP :
Flg.pause = FALSE ;
Flg.shuffle = FALSE ;
Flg.program = FALSE ;
/*-----------------------------------------------------------------------------
** プログラムモード時に停止中ならばプログラム設定曲をクリアする。
-----------------------------------------------------------------------------*/
if ( Playmode == SW_PROGRAM && CDDA_NOW_status == CDDA_STAT_STOP ) {
for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
Prginf[c] = ZERO ;
Prgcnt[c] = ZERO ;
}
Flg.tape = FALSE ;
disptocmode( SW_PROGRAM,DUMMY ) ;
disptime( ZERO,TM_NODISP ) ;
/* ●● STOP SWITCH ON ●● */
CDDA_switch( CDDA_SW_STOP ) ;
dispmsgclear() ;
dispprogramtime() ;
}
if ( CDDA_NOW_status == CDDA_STAT_PLAY ||
CDDA_NOW_status == CDDA_STAT_PAUSE ) {
/* ●● STOP SWITCH ON ●● */
CDDA_switch( CDDA_SW_STOP ) ;
}
dispshuffle( FALSE ) ;
disppause( FALSE ) ;
dispplay( FALSE ) ;
dispevent( evno,FALSE ) ;
break ;
case SW_PAUSE :
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
dispevent( evno,FALSE ) ;
break ;
}
if ( Playmode == SW_PROGRAM && CDDA_TOTAL_program == ZERO ) {
dispevent( evno,FALSE ) ;
break ;
}
if ( Flg.pause ) {
Flg.pause = FALSE ;
} else {
Flg.pause = TRUE ;
dispplay( TRUE ) ;
}
disppause( Flg.pause ) ;
/* ●● PAUSE SWITCH ON/OFF ●● */
CDDA_switch( CDDA_SW_PAUSE ) ;
break ;
}
}
/****************************** プログラム操作処理 ****************************/
void selectprogramsw( int sw )
/*=============================================================================
** プログラムの確認/クリアが選択された時の処理を行う.
**
** < INPUT > : プログラム確認/クリアスイッチ
** < OUTPUT > : なし
** < RETURN > : なし
**
** マウスは呼び側でOFFにしておいて下さい.
=============================================================================*/
{
int no, evno ;
int nowmusic ;
evno = sw + SWVAL ;
dispevent( evno,FALSE ) ;
if ( Playmode != SW_PROGRAM || CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
return ;
}
switch ( sw ) {
case SW_CHECK :
Timemode = TM_TR_CLOCK ;
/* ●● SCHECK SWITCH ON ●● */
no = CDDA_switch( CDDA_SW_PRG_CHECK ) ;
if ( no ) dispmusicno( CDDA_NOW_musicno,TRUE ) ;
Flg.prgchk = TRUE ;
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
printf( "<SW_CHECK> " ) ;
printf( "no = %d , %d 曲目 , musicno = %d\n",
no,CDDA_COUNT_program,CDDA_NOW_musicno ) ;
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
dispselectmusicno( CDDA_NOW_musicno ) ;
disptime( CDDA_NOW_musicno,Timemode ) ;
TAPE_check() ;
dispprogramtime() ;
break ;
case SW_CLEAR :
nowmusic = CDDA_NOW_musicno ;
/* ●● CLEAR SWITCH ON ●● */
no = CDDA_switch( CDDA_SW_PRG_CLEAR ) ;
if ( no > ZERO ) {
Timemode = TM_TR_CLOCK ;
Prginf[no-1] -- ;
Prgcnt[no-1] -- ;
if ( Prginf[no-1] <= ZERO ) {
dispmusicno( no,FALSE ) ;
}
Flg.prgchk = TRUE ;
dispselectmusicno( CDDA_NOW_musicno ) ;
disptime( CDDA_NOW_musicno,Timemode ) ;
/*-----------------------------------------------------------------------------
** status取得後の曲番号変化時に Prginf が デクリメント されるのを防ぐために、ここ
** で、Flg.playon を TRUE にしておく. (ただし、演奏中の曲を削除した時)
-----------------------------------------------------------------------------*/
if ( CDDA_NOW_status == CDDA_STAT_PLAY ||
CDDA_NOW_status == CDDA_STAT_PAUSE ) {
if ( no == nowmusic ) Flg.playon = TRUE ;
}
/*-----------------------------------------------------------------------------
** 演奏中(PAUSE中含)最後の曲を削除した場合には、テープ選択処理をクリアする.
-----------------------------------------------------------------------------*/
if ( !CDDA_TOTAL_program ) {
Flg.tape = FALSE ;
dispmsgclear() ;
}
TAPE_check() ;
dispprogramtime() ;
}
}
}
/****************************** 電子ボリューム処理 *****************************/
void selectelevol( void )
/*=============================================================================
** 電子ボリュームの操作を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
**
** マウスは呼び側でOFFにしておいて下さい.
=============================================================================*/
{
int mbot, mx, my ;
int vol ;
/*-----------------------------------------------------------------------------
** MUTE の ON/OFF は、マウスサポートなし.
-----------------------------------------------------------------------------*/
Flg.mute = FALSE ;
ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ; /* CD */
while ( TRUE ) {
MOS_rdpos( &mbot,&mx,&my ) ;
if ( mbot != MOS_LEFT ) break ;
if ( mx < Position[SW_ELEVOL].s.x ) { /* MIN */
Evol = ELEVOL_MIN ;
} else if ( mx > Position[SW_ELEVOL].e.x ) { /* MAX */
Evol = ELEVOL_MAX ;
} else { /* VAL */
vol = ( mx - Position[SW_ELEVOL].s.x ) / 3 ;
Evol = ( vol + 2 ) * 4 ;
}
dispelevol() ;
ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ; /* CD */
} ;
mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
}
/****************************** イベント情報表示 ******************************/
void debugevent( int evno )
/*=============================================================================
** イベントの選択状態を標準出力する.
**
** < INPUT > : イベントスイッチ
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
if ( !CDDA_DEBUG ) return ;
printf( "<event> switch on : " ) ;
if ( evno >= SWVAL ) {
switch ( evno-SWVAL ) {
case SW_EXIT :
printf( "EXIT\n" ) ;
break ;
case SW_TIME :
printf( "TIME\n" ) ;
break ;
case SW_REPEAT :
printf( "REPEAT\n" ) ;
break ;
case SW_CHECK :
printf( "CHECK\n" ) ;
break ;
case SW_CLEAR :
printf( "CLEAR\n" ) ;
break ;
case SW_STOP :
printf( "STOP\n" ) ;
break ;
case SW_PAUSE :
printf( "PAUSE\n" ) ;
break ;
case SW_SHUFFLE :
printf( "SHUFFLE\n" ) ;
break ;
case SW_PLAY :
printf( "PLAY\n" ) ;
break ;
case SW_REWMUSIC :
printf( "REW MUSIC\n" ) ;
break ;
case SW_REWTIME :
printf( "REW TIME\n" ) ;
break ;
case SW_FFTIME :
printf( "FF TIME\n" ) ;
break ;
case SW_FFMUSIC :
printf( "FF MUSIC\n" ) ;
break ;
case SW_PROGRAM :
printf( "PROGRAM\n" ) ;
break ;
case SW_SINGLE :
printf( "SINGLE\n" ) ;
break ;
case SW_CONTINUE :
printf( "CONTINUE\n" ) ;
break ;
case SW_ELEVOL :
printf( "ELEVOL\n" ) ;
break ;
}
} else {
printf( "曲番号 %d\n",evno ) ;
}
}
/******************************** イベント処理 ********************************/
int event( void )
/*=============================================================================
** 指定された処理を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : 終了の時 真値, それ以外は 偽値.
=============================================================================*/
{
int evno ;
int mbot, mx, my ;
if ( mosevent( &evno ) ) {
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
debugevent( evno ) ;
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
/*
** スイッチ操作あり
*/
if ( CDDA_NOW_status == CDDA_STAT_STOP ||
CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
Noaflg = TRUE ;
SNDPLAY_stop( STOP_CH ) ;
Tcount3 = NOA_WAIT + 1 ;
}
dispmouse( FALSE ) ;
/*-----------------------------------------------------------------------------
** evno が SWVALより大きな時には、演奏スイッチの処理である.
-----------------------------------------------------------------------------*/
if ( evno >= SWVAL ) {
/*-----------------------------------------------------------------------------
** EXIT / TIME / REPEAT / ELEVOL 処理
-----------------------------------------------------------------------------*/
switch ( evno-SWVAL ) {
case SW_EXIT :
SNDPLAY_play( EXIT_CH,EXIT_SND ) ;
/* ●● EJECT SWITCH ON ●● */
CDDA_switch( CDDA_SW_EXIT ) ;
dispevent( evno,FALSE ) ;
return( TRUE ) ;
case SW_TIME :
if ( CDDA_NOW_status != CDDA_STAT_PLAY &&
CDDA_NOW_status != CDDA_STAT_PAUSE ) break ;
switch ( Timemode ) {
case TM_TR_CLOCK :
Timemode = TM_TR_TIME ;
break ;
case TM_TR_TIME :
Timemode = TM_DISC_CLOCK ;
break ;
case TM_DISC_CLOCK :
Timemode = TM_DISC_TIME ;
break ;
case TM_DISC_TIME :
Timemode = TM_TR_CLOCK ;
break ;
default :
Timemode = TM_TR_CLOCK ;
}
/*-----------------------------------------------------------------------------
** Flg.prgchk が真値だと、時間表示されないので、FALSEにし待ち時間をクリアする.
-----------------------------------------------------------------------------*/
Flg.prgchk = FALSE ;
Tcount2 = PRG_WAIT + 1 ;
disptime( CDDA_NOW_musicno,Timemode ) ;
break ;
case SW_REPEAT :
if ( Flg.repeat ) {
Flg.repeat = FALSE ;
} else {
Flg.repeat = TRUE ;
}
/* ●● REPEAT SWITCH ON/OFF ●● */
CDDA_switch( CDDA_SW_REPEAT ) ;
disprepeat( Flg.repeat ) ;
break ;
case SW_ELEVOL :
selectelevol() ;
break ;
}
/*-----------------------------------------------------------------------------
** CHECK/CLEAR / STOP / PAUSE / SHUFFLE / PLAY / FF/REW / MODEスイッチ 処理
-----------------------------------------------------------------------------*/
switch ( evno-SWVAL ) {
case SW_CHECK :
case SW_CLEAR :
selectprogramsw( evno-SWVAL ) ;
break ;
case SW_STOP :
case SW_PAUSE :
selectstop( evno-SWVAL ) ;
break ;
case SW_SHUFFLE :
case SW_PLAY :
selectplay( evno-SWVAL ) ;
break ;
case SW_REWMUSIC :
case SW_REWTIME :
case SW_FFTIME :
case SW_FFMUSIC :
selectffrew( evno-SWVAL ) ;
break ;
case SW_PROGRAM :
case SW_SINGLE :
case SW_CONTINUE :
selectmode( evno-SWVAL ) ;
}
/*-----------------------------------------------------------------------------
** 曲番号指定時の処理
-----------------------------------------------------------------------------*/
} else {
selectmusic( evno ) ;
}
/*-----------------------------------------------------------------------------
** 一つの指定された処理を終了させるために マウス の開放を待つ.
** ( 次の マウス 処理に備える )
-----------------------------------------------------------------------------*/
mosloop( MOS_LEFT,&mbot,&mx,&my ) ; /* マウスの開放を待つ */
dispmouse( TRUE ) ;
}
return( FALSE ) ;
}
/****************************** CD演奏処理開始 *****************************/
void start( void )
/*=============================================================================
** CD PLAYER の機能を実行する.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int c ;
char *opening = "しばらくお待ちください...." ;
char *err = "メモリが足りません...." ;
/* マウス消去 */
dispmouse( FALSE ) ;
/*-----------------------------------------------------------------------------
** オープニングメッセージ表示
-----------------------------------------------------------------------------*/
EGB_color( Gwork,0,COLOR_TITLE ) ;
EGB_color( Gwork,1,COLOR_TITLE_BACK ) ;
EGB_paintMode( Gwork,0x02 ) ;
EGB_writeMode( Gwork,PSET ) ;
EGB_fontStyle( Gwork,0x0005 ) ; /* 影付&太文字 */
c = ( 80 - strlen( opening ) ) / 2 * XCDOT ;
disptext( Gwork,c,239,opening ) ;
EGB_fontStyle( Gwork,0x0000 ) ; /* 通常文字 */
/*-----------------------------------------------------------------------------
** CD 初期処理
-----------------------------------------------------------------------------*/
/* ●● 初期処理指定 ●● */
disperrormsg( CDDA_switch( CDDA_SW_INIT ) ) ;
Status = CDDA_NOW_status ;
/*-----------------------------------------------------------------------------
** 仮想ページを設定し、描く.(描いている過程を画面に表示しないため)
-----------------------------------------------------------------------------*/
Wpagebuf = malloc( 640*240 ) ;
if ( Wpagebuf == NULL ) {
EGB_color( Gwork,0,COLOR_ERROR ) ;
EGB_color( Gwork,1,COLOR_TITLE_BACK ) ;
EGB_paintMode( Gwork,0x02 ) ;
EGB_writeMode( Gwork,PSET ) ;
EGB_fontStyle( Gwork,0x0005 ) ; /* 影付&太文字 */
c = ( 80 - strlen( err ) ) / 2 * XCDOT ;
disptext( Gwork,c,239,err ) ;
EGB_fontStyle( Gwork,0x0000 ) ; /* 通常文字 */
return ;
}
EGB_resolutionRam( Gwork,WPAGE,4,640,480,Wpagebuf ) ;
EGB_writePage( Gwork,WPAGE ) ;
EGB_color( Gwork,1,COLOR_SCREEN_BACK ) ;
EGB_clearScreen( Gwork ) ;
/*-----------------------------------------------------------------------------
** 画面表示
-----------------------------------------------------------------------------*/
disptitle() ;
dispswitch() ;
disptoc( TRUE ) ;
if ( Status == CDDA_STAT_PLAY ) { /* 演奏中だった場合 */
dispplay( TRUE ) ;
for ( c=1; c<CDDA_NOW_musicno; c++ ) dispmusicno( c,FALSE ) ;
} else {
/* ●● PLAY SWITCH ON ●● */
if ( Startplay ) disperrormsg( CDDA_switch( CDDA_SW_PLAY ) ) ;
}
EGB_writePage( Gwork,1 ) ;
put( Gwork,0,0,639,479,(unsigned int)Wpagebuf,4 ) ;
free( Wpagebuf ) ;
/* マウス表示 */
if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
MOS_horizon( Position[SW_EXIT].s.x,Position[SW_EXIT].e.x ) ;
MOS_vertical( Position[SW_EXIT].s.y,Position[SW_EXIT].e.y ) ;
mossetpos( SW_EXIT+SWVAL ) ;
} else {
MOS_horizon( 0,639 ) ;
MOS_vertical( 0,479 ) ;
mossetpos( SW_PLAY+SWVAL ) ;
}
dispmouse( TRUE ) ;
/*-----------------------------------------------------------------------------
** COMPACT DISC PLAYER
-----------------------------------------------------------------------------*/
timer_init() ; /* タイマ割り込み登録 */
Tcount1 = CDC_WAIT + 1 ;
Tcount2 = PRG_WAIT + 1 ;
Tcount3 = ZERO ;
while ( TRUE ) {
if ( (Tcount1 > CDC_WAIT) ||
(CDDA_NOW_status == CDDA_STAT_NOTREADY) ) {
checkstatus() ;
Tcount1 = 0 ;
}
if ( Tcount1 < 0 ) Tcount1 = CDC_WAIT + 1 ;
if ( Tcount2 < 0 ) Tcount2 = PRG_WAIT + 1 ;
if ( Tcount3 < 0 ) Tcount3 = NOA_WAIT + 1 ;
if ( event() ) break ;
if ( KEY_event() ) break ;
} ;
timer_end() ; /* タイマ割り込み終了 */
KYB_clrbuf() ;
}
/***************************** CD演奏ライブラリ試験 ****************************/
int main( int ac,char *av[] )
/*=============================================================================
** MAIN ルーチン
**
** < INPUT > : 起動時コマンドライン
** < OUTPUT > : なし
** < RETURN > : 通常は 0 , オプションスイッチエラーの時は、1
=============================================================================*/
{
char cons, err ;
int c, cc, arglen ;
extern coninit() ;
/*-----------------------------------------------------------------------------
** 引数(オプションスイッチ)の処理を行う.
** 誤ったオプションが指定された場合には、プログラムを強制終了する.
-----------------------------------------------------------------------------*/
cons = FALSE ;
err = FALSE ;
if ( ac > 1 ) { /* 引数解析 */
for ( c=1; c<ac; c++ ) {
if ( *av[c] == '-' || *av[c] == '/' ) { /* オプションスイッチ */
arglen = strlen( av[c] ) ;
for ( cc=1; cc<arglen; cc++ ) {
switch ( *(av[c]+cc) ) {
case '/' :
case '-' :
break ;
case 'c' :
case 'C' :
cons = TRUE ;
break ;
case 'p' :
case 'P' :
Startplay = TRUE ;
break ;
case 's' :
case 'S' :
CDDA_FLG_stop = FALSE ;
break ;
case 'd' :
case 'D' :
CDDA_DEBUG = TRUE ;
break ;
default :
printf("\x1b[33m") ;
printf("Option switch error: %c",*(av[c]+cc)) ;
printf("\x1b[m\n") ;
err = TRUE ;
}
}
} else {
printf("\x1b[31m") ;
printf("Parameter error: %s",av[c]) ;
printf("\x1b[m\n") ;
err = TRUE ;
}
}
}
if ( err ) exit( TRUE ) ;
/*-----------------------------------------------------------------------------
** INT23h(CTRL+C)とINT24(CRITICAL ERROR) の マスク をする.
-----------------------------------------------------------------------------*/
int24_mask() ;
/*-----------------------------------------------------------------------------
** CD PLAYER 処理の開始
-----------------------------------------------------------------------------*/
init() ; /* 初期化 */
start() ;
/*-----------------------------------------------------------------------------
** CD PLAYER 処理の終了
-----------------------------------------------------------------------------*/
MOS_end() ; /* マウス終了 */
while ( TRUE ) {
if ( !SND_pcm_status( EXIT_CH ) ) break ;
MOS_rdpos( &Mosbot,&Mosx,&Mosy ) ;
if ( Mosbot ) break ;
}
SNDPLAY_stop( EXIT_CH ) ;
SND_end() ; /* サウンド終了 */
/*-----------------------------------------------------------------------------
** 音の終了処理
-----------------------------------------------------------------------------*/
if ( !CDDA_FLG_stop ) ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ;
else ELEVOL_mute() ;
/*-----------------------------------------------------------------------------
** コンソール画面に戻す
-----------------------------------------------------------------------------*/
if ( cons ) {
EGB_init( Gwork,GworkSize ) ; /* ゴミを消すため EGB 初期化 */
EGB_clearScreen( Gwork ) ;
coninit() ;
}
return( ZERO ) ;
}